package com.onec.service.customer.dao.merchant;

import cn.hutool.core.date.DateTime;
import com.onec.service.api.dao.BaseRepository;
import com.onec.service.customer.entity.merchant.MerchantInfo;
import org.springframework.data.jpa.repository.Lock;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.RepositoryDefinition;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.LockModeType;

/**
 * @author ONEC
 */
@RepositoryDefinition(domainClass = MerchantInfo.class, idClass = Long.class)
public interface MerchantInfoRepository extends BaseRepository<MerchantInfo, Long> {


    /**
     * 外部编号必须在系统唯一
     *
     * @param outCode
     * @return
     * @Link updateMerchantInfoByOutCode
     * @Transactional(isolation = Isolation.READ_COMMITTED)当事务处理完后，for update才会将行级锁解除
     * @Lock 作用的for update作用一样，将此行数据进行加锁，当整个方法将事务提交后，才会解锁
     * @deprecated 该方法暂不使用：使用：updateMerchantInfoByOutCode（）代替：
     */
    @Deprecated
    @Lock(value = LockModeType.PESSIMISTIC_WRITE)
    @Query(value = "select m from MerchantInfo m where m.outCode=?1")
    MerchantInfo findMerchantInfoByOutCode(String outCode);

    /**
     * outCode 必须加索引：
     *
     * @param data
     * @param outCode
     * @return
     */
    @Modifying
    @Query(value = "update MerchantInfo set updateTime=?1 where outCode=?2")
    Integer updateMerchantInfoByOutCode(DateTime data, String outCode);

    /**
     * 外部编号必须在系统唯一
     *
     * @param merchantNo
     * @return MerchantInfo
     */
    MerchantInfo findMerchantInfoByCode(String merchantNo);

    /**
     * 身份信息查询商户编号
     *
     * @param idCard
     * @return
     */
    MerchantInfo findMerchantInfoByIdCard(String idCard);
}
